package com.xiake.service.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.xiake.dao.base.BaseDao;


/**
 * @author 齐龙
 * @version 创建时间：2014年9月20日 下午8:28:17 类说明： Service 父接口
 * @param <T> 实体类泛型
 * @param <PK> 主键类型
 */
public interface BaseService<T, PK extends Serializable> {

  /**
   * 查询所有列表，无条件参数 例如：select * from user
   * 
   * @return List<T>
   * */
  public List<T> getAll() throws Exception;

  /**
   * 查询所有列表，并去除重复项
   * 
   * @return List<T>
   */
  public List<T> getAllDistinct() throws Exception;

  /**
   * 按照指定条件分页查询
   * 
   * @param conditions：查询条件集合
   * @return List<T>
   * */
  public List<T> page(Map<?, ?> conditions) throws Exception;

  /**
   * 根据指定条件分页查询扩展方法
   * 
   * @param conditions：条件集合
   * @param specificName：分页查询扩展方法后缀名
   * @return List<T>
   */
  public List<T> page(Map<?, ?> conditions, String specificName) throws Exception;

  /**
   * 按照指定条件查询列表 例如：select * from user where xxxxx
   * 
   * @param 查询条件集合
   * @return List<T>
   * */
  public List<T> query(Map<?, ?> conditions) throws Exception;

  /**
   * 按照指定条件查询列表扩展方法 例如：select * from user where xxxxx
   * 
   * @param 查询条件集合
   * @param 扩展方法后缀名
   * @return List<T>
   * */
  public List<T> query(Map<?, ?> conditions, String specificName) throws Exception;


  /**
   * 根据指定条件查询记录扩展方法
   * 
   * @param conditions：条件集合
   * @param specificName：查询记录方法后缀名
   * @return T
   */
  public T get(Map<?, ?> conditions, String specificName) throws Exception;

  /**
   * 根据指定条件查询记录扩展方法(主库读取)
   * 
   * @param conditions：条件集合
   * @param specificName：查询记录方法后缀名
   * @return T
   */
  public T forceGet(Map<?, ?> conditions, String specificName) throws Exception;

  /**
   * 根据指定条件查询记录
   * 
   * @param conditions：条件集合
   * @return T
   */
  public T get(Map<?, ?> conditions) throws Exception;

  /**
   * 根据指定条件查询记录(主库读取)
   * 
   * @param conditions：条件集合
   * @return T
   */
  public T forceGet(Map<?, ?> conditions) throws Exception;


  /**
   * 根据主键获取对象
   * */
  public T get(PK id) throws Exception;

  /**
   * 根据主键获取对象(主库读取)
   * */
  public T forceGet(PK id) throws Exception;

  /**
   * 按照指定条件统计数据
   * 
   * @return int
   * */
  public int count(Map<?, ?> conditions) throws Exception;

  public int countList(Map<?, ?> conditions) throws Exception;

  /**
   * 根据指定条件统计数据扩展方法
   * 
   * @param conditions：条件集合
   * @param specificName：统计数据扩展方法后缀名
   * @return int
   */
  public int count(Map<?, ?> conditions, String specificName) throws Exception;

  public int countList(Map<?, ?> conditions, String specificName) throws Exception;

  /**
   * 保存数据操作，根据ID是否为空来判断是添加操作，还是修改操作
   * 
   * @param object
   * @return T
   */
  public Integer save(T object) throws Exception;

  /**
   * 保存数据操作扩展方法，根据ID是否为空来判断是添加操作，还是修改操作
   * 
   * @param object
   * @param specificName:扩展方法后缀名
   * @return T
   */
  public Integer save(T object, String specificName) throws Exception;


  /**
   * 根据指定条件删除数据
   * 
   * @param conditions：条件集合
   */
  public void remove(Map<String, Object> conditions) throws Exception;

  /**
   * 根据指定条件删除数据扩展方法
   * 
   * @param conditions：条件集合
   * @param specificName：删除方法后缀名
   */
  public void remove(Map<String, Object> conditions, String specificName) throws Exception;

  /**
   * 为了获得导入的类名，而导入的类名只有dao中有，所以需要此函数。
   */

  public BaseDao<T, PK> getDao();

}
